home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / ask / askden / source / den2var.s < prev   
Text File  |  1999-04-05  |  11KB  |  473 lines

  1. ******************************************************************************
  2. *    ASK3アクセサリ  ASKDen V2以降用 変数ダンププログラム
  3. *        Copyright 1998-99 by AIG-Soft
  4. ******************************************************************************
  5.  
  6.     .include    defines.mac
  7.     .include    fefunc.mac    * 整数/実数演算を使う
  8.     .include    pspdef.mac
  9.     .cpu        68000
  10.  
  11. ******************************************************************************
  12. *    常駐チェックid(ASKDen2と同じ位置に置く)
  13. ******************************************************************************
  14.  
  15.     .text
  16.     .even
  17. KEEP_START:
  18.     * 常駐確認用識別子
  19. varad    .dc.l    0        * ASKDen2はここにvarのアドレスが入っている
  20. id:    .dc.b    'ASKDen V2',0
  21.  
  22. ******************************************************************************
  23. * 定数表
  24. ******************************************************************************
  25.  
  26. Yuketa    equ    6        * 32ビット単精度実数の有効桁数
  27.                 * 実験の結果より6桁なら大丈夫らしい
  28. * 変数関係
  29. VTYPE    equ    %1_1111        * 変数型(32種類)
  30. VKAKU    equ    BIT7        * 0=確定 , 1=未確定
  31. VDAI    equ    BIT6        * 0=再代入可 , 1=不可
  32. BVDAI    equ    6        * VDAIのビット番号
  33. V_INT    equ    0        * 0=整数数値(すべての演算可能)
  34. V_FLOAT    equ    1        * 1=単精度実数
  35. *
  36. VTOP    equ    2        * 変数格納先頭位置:ハッシュの関係で0は使えない
  37.  
  38.     .offset    0
  39. * 変数構造体
  40. vwork    .ds.l    1    * unchar *vwork        ワークエリア先頭アドレス(初期値は0=確保してない)
  41. vwsize    .ds.l    1    * long vwsize
  42. vpoint    .ds.l    1    * long vpoint        変数格納先頭位置:ハッシュの都合で0は使えない
  43. vlots    .ds.l    1    * long vlots
  44. vhash    .ds.l    1    * long *vhash
  45. vhsize    .ds.w    1    * unsint vhsize
  46. vlmax    .ds.w    1    * unsint vlmax    変数名最大長
  47. mode    .ds.w    1    * unsint mode
  48.  
  49.     .offset    0
  50. * 変数格納オフセット
  51. *    len mode num name[00]
  52. *    1   1    4   len+1        size
  53. *    0   1    2   6        6+len+1    offset
  54. Vlen        .ds.b    1
  55. Vmd        .ds.b    1
  56. Vnum        .ds.l    1
  57. Vname
  58.     .text
  59. sizeV    equ    Vname        * len+mode+numのサイズ
  60.  
  61. ******************************************************************************
  62.  
  63. ctol:
  64. * long ctol(adrs)
  65. * d0,a0破壊
  66.     move.l    4(sp),d0
  67.     move.l    d0,a0
  68.     btst.l    #0,d0
  69.     bne    1f
  70.     * 偶数アドレス = 直接読み出来る
  71.     move.l    (a0),d0
  72.     rts
  73.  
  74. 1:    * 奇数アドレス = 直接読み出来ない
  75.     move.l    1(a0),d0    * 次のアドレスからH.L/L.H/L.L/DUMMYを読み取る
  76.     move.b    (a0),d0
  77.     ror.l    #8,d0
  78.     rts
  79.  
  80. ******************************************************************************
  81.  
  82. make_base:
  83. * 2/8/10/16進数文字列作成(整数のみ)
  84. * 一番長くなるのは2進数で32ビット分=32バイト+符号
  85. * base >0 : 正で処理 , base < 0 : 符号つきで処理
  86. * int make_base(int code,unchar dec[2+BINT+1],int base)
  87. ofs    =    (4*2)
  88. regs    .reg    d3/d4
  89.     movem.l    regs,-(sp)
  90.     move.l    ofs+4(sp),d0    * num(unsigned)<-code
  91.     moveq.l    #32+2,d3    * i
  92.     moveq.l    #0,d2        * sign=0(.wでいい)
  93.     move.l    ofs+12(sp),d1    * base<0?
  94.     bpl    1f        * No
  95.     * base<0 : 符号付き
  96.     tst.l    d0        * code<0?
  97.     bpl    2f        * No
  98.     * code<0
  99.     neg.l    d0        * num=-code
  100.     beq    2f        * num==0? Yes
  101.     * num!=0
  102.     moveq.l    #1,d2        * sign=1
  103. 2:    neg.l    d1        * base=-base
  104.     *
  105. 1:    move.l    ofs+8(sp),a0    * dec
  106.     lea    (a0,d3.l),a0    * dec[i]
  107.     clr.b    (a0)        *       =EOS
  108.     lea    b(pc),a1    * b[]
  109. 3:    cmp.l    d1,d0        * num>=base?
  110.     bcs    4f        * No
  111.     move.l    d0,d4
  112.     FPACK    __UMOD        * d4.l=num%base    d0%=d1(符号なし)
  113.     exg    d0,d4
  114.     move.b    (a1,d4.l),-(a0)    * dec[--i]=b[num%base];
  115.     subq.l    #1,d3        * --i
  116.     FPACK    __UDIV        * num/=base    d0/=d1(符号なし)
  117.     bra    3b
  118.     *
  119. 4:    move.b    (a1,d0.l),-(a0)    * dec[--i]=b[num]
  120.     subq.l    #1,d3        * --i
  121.     tst.w    d2        * sign==1?
  122.     beq    @f        * No
  123.     move.b    #'-',-(a0)    * 負号
  124.     subq.l    #1,d3        * --i
  125. @@:    move.l    d3,d0        * return(i)
  126.     movem.l    (sp)+,regs
  127.     rts
  128. *
  129. b    .dc.b    '0123456789ABCDEF',0
  130.     .even
  131.  
  132. ******************************************************************************
  133.  
  134. var_dump:
  135. * 変数領域ダンプ
  136. * void var_dump(&var)
  137. * ASKDen2のそれと全く同じではない
  138. regs    .reg    d3-d6/a3-a4
  139. ofs    =    (4*(4+2))
  140.     movem.l    regs,-(sp)
  141.     move.w    base(pc),d0
  142.     lea    bases(pc),a0    * その時の表示進数に従う
  143.     moveq.l    #0,d4        * for .b = .l
  144.     move.b    (a0,d0.w),d4    * bs=bases[base]
  145.     moveq.l    #0,d6        * for .b = .w
  146.     lea    Bsym(pc),a0
  147.     move.b    (a0,d0.w),d6    * $%@
  148.     *
  149.     move.l    4+ofs(sp),a0    * varのアドレス
  150.     move.l    vlots(a0),d3    * vlots
  151.     bne    @f        * 変数はある
  152.     * 変数がない
  153.     bsr    PrCRLF
  154.     pea    MesNoVar(pc)
  155.     DOS    _PRINT
  156.     addq.l    #4,sp
  157.     bra    7f
  158. *
  159. @@:    move.l    vwork(a0),a3    * vwork
  160.     addq.l    #VTOP,a3    * &vwork[VTOP]
  161.     *
  162. 5:    bsr    PrCRLF        * 改行
  163.     pea    Vname(a3)    * vname
  164.     DOS    _PRINT        * 変数名
  165.     addq.l    #4,sp
  166.     bsr    PrTAB
  167.     *
  168.     pea    Vnum(a3)
  169.     bsr    ctol        * d0.l=num
  170.     addq.l    #4,sp
  171.     move.l    d0,d5
  172.     *
  173.     move.b    Vmd(a3),d0    * md
  174.     moveq.l    #VKAKU,d1
  175.     and.b    d0,d1
  176.     beq    @f        * 確定
  177.     * 未確定
  178.     pea    MesMikaku(pc)
  179.     bra    6f
  180. *
  181. @@:    * 確定
  182.     clr.b    eover        * エラー無しの印
  183.     lea    MesDeni(pc),a4
  184.     and.b    #VTYPE,d0
  185.     beq    v2        * 整数
  186.     * 実数
  187.     lea    MesDenf(pc),a4
  188.     cmp.l    #10,d4        * 10進数?
  189.     bne    @f        * No
  190.     * 実数10進表示
  191.     lea    work(pc),a0    * 流用
  192.     move.l    d5,d0        * num
  193.     moveq.l    #Yuketa,d2    * 全体の桁数
  194.     FPACK    __FGCVT
  195.     pea    work(pc)
  196.     bra    6f        * 表示へ
  197. *
  198. @@:    * 実数10進以外
  199.     tst.b    fnai
  200.     bne    v2        * 内部表現表示
  201.     * 整数化表示
  202.     move.l    d5,d0
  203.     FPACK    __FTOL        * float(d0) -> int(d0)
  204.     scs.b    eover        * 整数化出来ないの印
  205.     bcs    v2        * 整数化出来ない時はしない
  206. @@:    move.l    d0,d5
  207.     *
  208. v2:    * 整数はいきなりここへ来る
  209.     move.l    d4,-(sp)    * 表示進数
  210.     pea    work(pc)    * workを流用
  211.     move.l    d5,-(sp)    * num
  212.     bsr    make_base    * ret=d0
  213.     lea    4*3(sp),sp
  214.     lea    work(pc),a0
  215.     add.l    d0,a0        * &work[ret]
  216.     * 進数記号表示
  217.     cmp.l    #10,d4
  218.     beq    @f
  219.     move.w    d6,-(sp)
  220.     DOS    _PUTCHAR    * d6.bのみ表示される
  221.     addq.l    #2,sp
  222. @@:    pea    (a0)
  223. 6:    DOS    _PRINT        * 数値表示
  224.     bsr    PrTAB
  225.     pea    (a4)        * 整数/実数
  226.     DOS    _PRINT
  227.     addq.l    #8,sp
  228.     *
  229.     tst.b    eover        * 整数化出来てる?
  230.     beq    @f
  231.     * 整数化出来てない
  232.     move.w    #'(',-(sp)
  233.     DOS    _PUTCHAR
  234.     pea    MVARCCINT(pc)
  235.     DOS    _PRINT        * "(整数化出来ない)"を表示
  236.     move.w    #')',-(sp)
  237.     DOS    _PUTCHAR
  238.     addq.l    #8,sp
  239. @@:    *
  240.     btst.b    #BVDAI,Vmd(a3)    * md&VDAI?
  241.     beq    @f
  242.     bsr    PrTAB
  243.     pea    MesTeisu(pc)    * 定数=再代入不可
  244.     DOS    _PRINT
  245.     addq.l    #4,sp
  246. @@:    *
  247.     moveq.l    #0,d0        * for .b=.l
  248.     move.b    (a3)+,d0    * len
  249.     addq.l    #sizeV,d0    * len(1):md(1):num(4):vname(len):EOS
  250.     add.l    d0,a3        * 次の変数へ
  251.     *
  252.     subq.l    #1,d3        * 変数がある間
  253.     bne    5b
  254.     *
  255.     bsr    PrCRLF        * 最後の改行
  256. 7:    movem.l    (sp)+,regs
  257.     rts
  258.  
  259. PrTAB:
  260.     move.w    #TAB,-(sp)
  261.     DOS    _PUTCHAR    * TAB
  262.     addq.l    #2,sp
  263.     rts
  264.  
  265. PrCRLF:
  266.     pea    CrLf(pc)
  267.     DOS    _PRINT        * 改行
  268.     addq.l    #4,sp
  269.     rts
  270.  
  271. ******************************************************************************
  272. * この中ではa0/a2は壊さないこと(プロセス管理ポインタ/コマンドラインを参照するため)
  273.  
  274. AMAX    equ    10    * 最大引数数
  275.  
  276. * コマンドライン
  277. * a2
  278. * 0(a2)   = コマンドライン長
  279. * 1(a2)~ = コマンドライン
  280. *        '-? ',0    スペース/タブはそのまま
  281. *
  282. GetArgv:
  283. * コマンドラインを解析して各要素の先頭アドレスをargvに、個数をargcに格納する
  284. * 引数:a2   = コマンドライン
  285. * 出力:d0.w = 引数数(=argc)
  286. * 破壊:d0-d1
  287. regs    .reg    a2/a6
  288.     movem.l    regs,-(sp)
  289.     moveq.l    #0,d1        * 引数数
  290.     tst.b    (a2)+        * コマンドライン長を飛ばす
  291.     beq    2f        * コマンドライン長=0 -> 引数なし
  292.     lea    argv(pc),a6
  293. @@:    * SPC/TAB skip
  294.     move.b    (a2)+,d0
  295.     beq    2f        * コマンドライン終わり
  296.     cmp.b    #SPC,d0        * skip SPC
  297.     beq    @b
  298.     cmp.b    #TAB,d0        * skip TAB
  299.     beq    @b
  300.     * SPC/TAB以外の文字が有った
  301.     subq.l    #1,a2
  302.     move.l    a2,(a6)+    * argv記録
  303.     addq.w    #1,d1        * 引数+1
  304.     cmp.w    #AMAX,d1    * 最大数を越える?
  305.     bcc    2f        * -> 越える
  306. 1:    * 次のEOS/SPC/TABまで飛ばす
  307.     move.b    (a2)+,d0
  308.     beq    2f        * コマンドライン終わり
  309.     cmp.b    #SPC,d0        * skip SPC
  310.     beq    @b
  311.     cmp.b    #TAB,d0        * skip TAB
  312.     bne    1b
  313.     bra    @b
  314.     *
  315. 2:    move.w    d1,argc        * 記録
  316.     move.w    d1,d0
  317.     movem.l    (sp)+,regs
  318.     rts
  319.  
  320. *---------------------------------------------
  321.  
  322. CheckOption:
  323. * コマンドラインから指定オプションを探す
  324. * 必ずGetArgvを呼び出した後に使うこと
  325. * オプション名は先頭1文字だけで判別
  326. * 引数:d2.b = オプション名(英小文字1文字/大文字の時は直後の文字列をa6に転送)
  327. *    a6.l = 直後文字列転送エリアアドレス
  328. * 出力:d0.l = 0:なし , !=0:そのオプションの次のアドレス
  329. * 破壊:d0-d1
  330. regs    .reg    d7/a4-a6
  331.     movem.l    regs,-(sp)
  332.     moveq.l    #0,d7        * 後ろ引数取り込まない
  333.     cmp.b    #'a',d2        * オプション名'a'>=?
  334.     bcc    @f        * Yes
  335.     moveq.l    #1,d7        * 英大文字;後ろ引数取り込む
  336.     or.b    #$20,d2        * 小文字化
  337.     *
  338. @@:    move.w    argc(pc),d1
  339.     beq    1f        * 引数はない
  340.     subq.w    #1,d1        * -1 for dbra
  341.     lea    argv(pc),a4
  342. @@:    move.l    (a4)+,a5    * argv[i]
  343.     move.b    (a5)+,d0    * argv[i][0]
  344.     * オプションの1文字目は'/''-'
  345.     cmp.b    #'/',d0
  346.     beq    2f
  347.     cmp.b    #'-',d0
  348.     beq    2f
  349. 3:    dbra    d1,@b        * 次へ
  350. 1:    * (指定)オプションはない
  351.     moveq.l    #0,d0
  352.     bra    4f
  353.  
  354. 2:    * '/''-'があった
  355.     move.b    (a5)+,d0    * 次の1文字
  356.     or.b    #$20,d0        * 英小文字化
  357.     cmp.b    d2,d0        * 一致?
  358.     bne    3b        * -> 不一致
  359.     move.l    a5,d0        * オプション名の次のアドレス(!=0)
  360.     tst.w    d7        * 後ろ取り込む?
  361.     beq    4f        * No
  362.     * 後ろ引数の取り込み -> a6
  363.     * d0=a5 ; オプション名の次のアドレス(!=0)
  364. @@:    move.b    (a5)+,d1
  365.     beq    5f        * EOS
  366.     cmp.b    #SPC,d1
  367.     beq    5f
  368.     cmp.b    #TAB,d1        * EOS/SPC/TABまで
  369.     beq    5f
  370.     move.b    d1,(a6)+
  371.     bra    @b
  372. *
  373. 5:    clr.b    (a6)        * EOS
  374. 4:    movem.l    (sp)+,regs
  375.     rts
  376.  
  377. ******************************************************************************
  378. *    メイン
  379. ******************************************************************************
  380.  
  381.     .xref    Atoi
  382.     .xref    keepchk2
  383.  
  384. main:
  385.     move.l    #(id-KEEP_START),-(sp)    * 識別子の相対位置
  386.     pea.l    (a0)        * 自分のメモリ管理ポインタ
  387.     bsr    keepchk2    * 常駐チェック    -> d0.b , a0.l
  388.     addq.l    #4*2,sp
  389.     tst.b    d0
  390.     bne    ok        * 常駐してる
  391.     * 常駐してない; エラー終了
  392.     pea    MesNoKeep(pc)
  393.     DOS    _PRINT
  394. **    addq.l    #4,sp
  395.     move.w    #2,-(sp)    * exit(2)
  396.     DOS    _EXIT2
  397. *
  398. ok:    lea    varad-KEEP_START+PSPSIZ(a0),a4        * varadのアドレス
  399.     *
  400.     bsr    GetArgv        * argc/argv設定
  401.     *
  402.     * 引数チェック
  403.     moveq.l    #'p',d2            * -p : 表示符号あり
  404.     bsr    CheckOption
  405.     tst.l    d0
  406.     seq    hugo            * -pなし=符号あり
  407.     *
  408.     moveq.l    #'n',d2            * -n : 内部表記する・しない
  409.     bsr    CheckOption
  410.     tst.l    d0
  411.     sne    fnai            * -nあり=内部表記する
  412.     *
  413.     lea    work(pc),a6
  414.     moveq.l    #'S',d2            * -Smode : 表示進数[mode=0,1,2,3]
  415.     bsr    CheckOption
  416.     move.l    #0,d2            * デフォルト:10進数
  417.     tst.l    d0
  418.     beq    @f            * 指定なし
  419.     * 指定あり : モード読み取り
  420.     bsr    Atoi            * 読み取り -> d0.l (d0/d1/a6破壊)
  421.     * サイズ判定
  422.     cmp.l    #3,d0
  423.     bhi    @f            * >3は0とみなす
  424.     tst.l    d0
  425.     bmi    @f            * <0も0とみなす
  426.     move.l    d0,d2
  427. @@:    move.w    d2,base
  428.     *
  429.     sub.l    a0,a0
  430.     IOCS    _B_SUPER        * スーパーバイザーモードへ
  431.     move.l    d0,-(sp)
  432.     *
  433.     move.l    (a4),-(sp)        * 常駐しているプロセス内のvarアドレス
  434.     bsr    var_dump
  435.     addq.l    #4,sp
  436.     *
  437.     move.l    (sp)+,d0
  438.     beq    @f            * 元がスーパーバイザーモードである
  439.     move.l    d0,a1
  440.     IOCS    _B_SUPER
  441.     *
  442. @@:    clr.w    -(sp)
  443.     DOS    _EXIT2            * 正常終了
  444.  
  445. ******************************************************************************
  446. * メッセージ&ワーク
  447. ******************************************************************************
  448.  
  449. MesNoKeep:    .dc.b    '対応するASKDen2が常駐していません',CR,LF,0
  450. MVARCCINT    .dc.b    '整数化出来ない',0
  451. MesNoVar:    .dc.b    '変数はありません'    * CrLfに続く
  452. CrLf:        .dc.b    CR,LF,0
  453. MesMikaku:    .dc.b    '[未確定]',0
  454. MesTeisu:    .dc.b    '[定数]',0
  455. MesDeni:    .dc.b    '整数',0
  456. MesDenf:    .dc.b    '実数',0
  457. Bsym        .dc.b    ' $%@',0    * 進数シンボル(baseの順)
  458.     .even
  459. argc        .ds.w    1        * 引数の個数
  460. argv        .ds.l    AMAX        * 各引数の先頭アドレス
  461. var        .ds.l    1        * 変数構造体のアドレス
  462. work        .ds.b    96        * 数値などのバッファー
  463. eover        .dc.b    1        * エラーフラグ
  464.     .even
  465. bases        .dc.b    10,16,2,8    * 進数テーブル
  466. base:        .dc.w    0        * 10進数(bases[base])
  467.  
  468. hugo        .dc.b    $ff    * 0=符号なし,$ff=符号有り
  469. fnai        .dc.b    0    * 0=整数化,$ff=内部表現
  470.  
  471. ******************************************************************************
  472.     .end    main
  473.